
#include "Cable.h"
#include <iostream>


Cable::Cable() {
	this->seleccionado = false;
	this->recalculando_cable = false;
	this->estado_recalculando = INVALIDO;
}


void Cable::agregar_punto(int x, int y){
	lista_puntos.push_back(new PuntoQuiebre(x, y));
}

void Cable::recalcular_camino (int inicio_x, int inicio_y, int fin_x, int fin_y){
	std::list< PuntoQuiebre* >::iterator it = lista_puntos.begin();
	unsigned int i;
	for (i = 0; i < lista_puntos.size(); i++){
		delete (*it);
		it++;
	}
	lista_puntos.clear();
	if (fin_x > inicio_x){
		lista_puntos.push_back(new PuntoQuiebre(inicio_x, inicio_y));
		lista_puntos.push_back(new PuntoQuiebre(inicio_x + ((fin_x-inicio_x)/2), inicio_y));
		lista_puntos.push_back(new PuntoQuiebre(inicio_x + ((fin_x-inicio_x)/2), fin_y));
		lista_puntos.push_back(new PuntoQuiebre(fin_x, fin_y));
	}
	else{
		lista_puntos.push_back(new PuntoQuiebre(inicio_x, inicio_y));
		lista_puntos.push_back(new PuntoQuiebre(inicio_x + TAMANIO/2, inicio_y));
		lista_puntos.push_back(new PuntoQuiebre(inicio_x + TAMANIO/2, inicio_y + ((fin_y-inicio_y)/2)));
		lista_puntos.push_back(new PuntoQuiebre(fin_x - TAMANIO/2, inicio_y + ((fin_y-inicio_y)/2)));
		lista_puntos.push_back(new PuntoQuiebre(fin_x - TAMANIO/2, fin_y));
		lista_puntos.push_back(new PuntoQuiebre(fin_x, fin_y));

	}
}

void Cable::camino_nuevo_extremo (int posicion_x, int posicion_y){


	if (estado_recalculando == MOVIENDO_INICIO){
		std::list<PuntoQuiebre*>::iterator it_inicio = lista_puntos.begin();
		int x = (*it_inicio)->get_x()/TAMANIO;
		x = x*TAMANIO;
		int y = (*it_inicio)->get_y()/TAMANIO;
		y = y*TAMANIO;
		int delta_x = (*it_inicio)->get_x()-x;
		int delta_y = (*it_inicio)->get_y()-y;
		std::list<PuntoQuiebre*>::iterator it_fin = lista_puntos.end();
		it_fin--;
		//posicion_x + delta_x da el punto exacto donde comienza el cable, idem para la variable y
		recalcular_camino (posicion_x + delta_x, posicion_y + delta_y, (*it_fin)->get_x(), (*it_fin)->get_y());
	}
	else if (estado_recalculando == MOVIENDO_FINAL){
		std::list<PuntoQuiebre*>::iterator it_inicio = lista_puntos.begin();
		std::list<PuntoQuiebre*>::iterator it_fin = lista_puntos.end();
		it_fin--;
		int x = (*it_fin)->get_x()/TAMANIO;
		x = x*TAMANIO;
		int y = (*it_fin)->get_y()/TAMANIO;
		y = y*TAMANIO;
		int delta_x = (*it_fin)->get_x()-x;
		int delta_y = (*it_fin)->get_y()-y;
		//posicion_x + delta_x da el punto exacto donde termina el cable, idem para la variable y
		recalcular_camino ((*it_inicio)->get_x(), (*it_inicio)->get_y(), posicion_x+delta_x, posicion_y+delta_y);
	}
}

void Cable::recalcular_camino_relativo(int referencia_x, int referencia_y, int posicion_x, int posicion_y){
	if (estado_recalculando == MOVIENDO_INICIO){
		std::list<PuntoQuiebre*>::iterator it_inicio = lista_puntos.begin();
		int x = (*it_inicio)->get_x()/TAMANIO;
		x = x*TAMANIO;
		int y = (*it_inicio)->get_y()/TAMANIO;
		y = y*TAMANIO;
		int delta_x = (*it_inicio)->get_x()-x;
		int delta_y = (*it_inicio)->get_y()-y;
		int x_inicial = (posicion_x-referencia_x) + x;
		int y_inicial = (posicion_y-referencia_y) + y;
		std::list<PuntoQuiebre*>::iterator it_fin = lista_puntos.end();
		it_fin--;
		recalcular_camino (delta_x + x_inicial, delta_y + y_inicial, (*it_fin)->get_x(), (*it_fin)->get_y());
	}
	else if (estado_recalculando == MOVIENDO_FINAL){
		std::list<PuntoQuiebre*>::iterator it_inicio = lista_puntos.begin();
		std::list<PuntoQuiebre*>::iterator it_fin = lista_puntos.end();
		it_fin--;
		int x = (*it_fin)->get_x()/TAMANIO;
		x = x*TAMANIO;
		int y = (*it_fin)->get_y()/TAMANIO;
		y = y*TAMANIO;
		int delta_x = (*it_fin)->get_x()-x;
		int delta_y = (*it_fin)->get_y()-y;

		int x_final = (posicion_x-referencia_x) + x;
		int y_final = (posicion_y-referencia_y) + y;
		recalcular_camino ((*it_inicio)->get_x(), (*it_inicio)->get_y(), delta_x + x_final, delta_y + y_final);
	}
}


void Cable::trasladar_x_rel(int inicial_x, int final_x){
	int auxiliar = final_x - inicial_x;
	std::list<PuntoQuiebre*>::iterator it_puntos = lista_puntos.begin();
	unsigned int i;
	for (i=0; i<lista_puntos.size(); i++){
		(*it_puntos)->trasladar_x(auxiliar);
		it_puntos++;
	}

}

void Cable::trasladar_y_rel(int inicial_y, int final_y){
	int auxiliar = final_y - inicial_y;
	std::list<PuntoQuiebre*>::iterator it_puntos = lista_puntos.begin();
	unsigned int i;
	for (i=0; i<lista_puntos.size(); i++){
		(*it_puntos)->trasladar_y(auxiliar);
		it_puntos++;
	}

}

Cable::~Cable() {
	unsigned int i;

	std::list< PuntoQuiebre* >::iterator it = lista_puntos.begin();
	for (i = 0; i < lista_puntos.size(); i++){
		delete (*it);
		it++;
	}

}
